// ================================
// 20.2 标签调度 (Tag Dispatching)
// ================================

标签调度是C++模板编程中一种强大的技术, 用于根据类型特性选择不同的函数实现。这种技术在标准库中被广泛使用, 特别是在STL算法实现中。


// 基本概念
标签调度的核心思想是: 
1.创建空的"标签"类型(tag types)作为类型标识
2.基于类型特性选择合适的标签
3.使用重载函数根据标签选择正确的实现

// 实现方式
通常的实现包括以下步骤: 
// 1. 标准库中的迭代器类别层次
struct input_iterator_tag { };
struct forward_iterator_tag : public input_iterator_tag { };
struct bidirectional_iterator_tag : public forward_iterator_tag { };
struct random_access_iterator_tag : public bidirectional_iterator_tag { };

// 自定义迭代器示例
template <typename T>
class MyIterator {
public:
    // 迭代器特性定义
    using iterator_category = std::forward_iterator_tag;  // 指定类别
    using value_type = T;
    using difference_type = std::ptrdiff_t;
    using pointer = T*;
    using reference = T&;
    
    // 迭代器实现...
};

// 2. 为不同的标签类型提供重载函数
template <typename Iterator>
void advance_impl(Iterator& it, typename std::iterator_traits<Iterator>::difference_type n, 
                 input_iterator_tag) {
    // 对输入迭代器的低效实现
    while (n > 0) { ++it; --n; }
}

template <typename Iterator>
void advance_impl(Iterator& it, typename std::iterator_traits<Iterator>::difference_type n,
                 random_access_iterator_tag) {
    // 对随机访问迭代器的高效实现
    it += n;
}

// 3. 主函数通过标签调度选择正确的实现
template <typename Iterator, typename Distance>
void advance(Iterator& it, Distance n) {
    advance_impl(it, n, 
                typename std::iterator_traits<Iterator>::iterator_category());
}


// 标签调度的优势
1.编译期选择: 在编译时决定使用哪个实现, 没有运行时开销
2.类型安全: 完全基于类型系统, 编译器可以检查错误
3.代码清晰: 比SFINAE更直观, 实现逻辑更清晰
4.性能优化: 可以为不同能力的类型提供不同效率的实现
